//
// Description: 解题大招-斗智斗勇
// Created by Loading on 2021/1/30.
//

// 雪球偷偷拿到了m个解题大招，但被大招守卫困在了一条长长的走廊里。走廊由n个1x1的方格排成一行构成，从左到右1--n进行编号。雪球开始在a号方格，守卫开始在b号方格（a!=b）。
// 雪球的任务是在守卫抓住他前尽可能多的把大招传送回家，每个解题大招传送需要的时间不同，第i个大招需要S[i]秒。
//
// 现在，每秒钟会有下面3个事件按顺序发生：
// 1. 雪球可以向任意方向移动一格（只要不撞到守卫，不移出走廊），也可以原地不动启动传送某个大招（传送开始就会自动进行），但不能同时移动和启动传送。
// 2. 已经开始传送的一些大招会完成传送。比如t秒前雪球开始传送第j个大招，S[j]=t，这一秒第j个大招会传送完成。
// 3. 最后，大招守卫会向雪球的方向移动一格，如果移动到了雪球所在的位置，就抓住了他。
// 你的任务是计算雪球被抓住前，最多可以完成多少个大招的传送。

// Input
// 第一行是整数 t(1≤t≤1000)表示测试case的数量
// 每个case由两行组成，第一行是四个整数n, m, a，b (2≤n≤10^9; 1≤m≤2x10^5; 1≤a,b≤n; a!=b) 分别是方格数，大招数，雪球位置，守卫位置。第二行是m个整数S[1] -- S[m] (1≤S[i]≤10^9)，表示大招传送需要的时间。所有测试case中的m累加不会超过2x10^5
//
// Output
// 对每个测试case，输出一个整数，表示雪球被抓住前，最多可以完成多少个大招的传送。

// Example
// 输入
// 3
// 7 2 2 5
// 1 3
// 7 2 2 5
// 4 1
// 7 2 2 5
// 4 4
//
// 输出
// 2
// 1
// 0


#include <bits/stdc++.h>

using namespace std;

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n, m, a, b;
        cin >> n >> m >> a >> b;
        vector<int> s(m);
        vector<int> s_;
        int tempb, tempa, cnt = 0;

        //根据a与b的大小关系 判断该向走廊哪一侧移动，并计算最大移动距离
        if (b > a) {
            tempb = b - 1;
            tempa = a - 1;
        } else {
            tempb = n - b;
            tempa = n - a;
        }
        for (int i = 0; i < m; ++i) {
            cin >> s[i];
            //传送时间大于等于守卫最大移动距离，不可能传送成功
            if (s[i] < tempb) {
                s_.emplace_back(s[i]);
            }
        }

        sort(s_.begin(), s_.end());

        while (tempa + 1 != tempb) {//守卫和雪球相距一格时，不可再继续传送大招
            if (!s_.empty()) {//可传送队列仍有大招
                if (s_[s_.size() - 1] < tempb) {
                    cnt++;
                    tempb--;//守卫移动
                }
                s_.pop_back();
            } else {
                break;
            }
        }

        cout << cnt << endl;
    }
}